package main

import (
	"fmt"
	"time"
)

func D6main() {
	// 5 最后执行这个
	defer fmt.Println("defer main")
	var user = ""

	go func() {
		// 3 第二个执行这个defer
		defer func() {
			fmt.Println("defer caller")
			// recover只能恢复同一个协程里边的panic
			if err := recover(); err != nil {
				fmt.Println("recover success. err:", err)
			}
		}()

		func() {
			// 2 当前进程出现panic 最先执行这个defer 因为他最后被添加
			defer func() {
				fmt.Println("defer here")
			}()

			if user == "" {
				// 1 程序出现panic 当前进程结束
				panic("should set user env.")
			}

			// 所以这句不会执行
			fmt.Println("after panic")
		}()
	}()

	time.Sleep(1 * time.Second)

	// 4 等待一秒后执行这个
	fmt.Println("end of main function")

}
